﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;

namespace RM2012Service.DataService
{
    public class DBConnection
    {
        /// <summary>
        /// Hàm khởi tạo một đối tượng DBConnection
        /// </summary>
        /// <qualifier></qualifier>
        /// <body></body>
        /// <returns></returns>
        public DBConnection() { }

        /// <summary>
        /// Property cho phép lấy về chuỗi kết nối đến Database thông qua file web.config
        /// </summary>
        public string ConnectionString
        {
            get
            {
                return ConfigurationManager.ConnectionStrings["connString"].ConnectionString;
            }
        }

        /// <summary>
        /// Đầu vào là tên một thủ tục và các tham số truyền vào thủ tục đó
        /// Đầu ra là một DataSet (Kiểu dữ liệu có cấu trúc bảng)
        /// </summary>
        /// <qualifier></qualifier>
        /// <body></body>
        /// <param>string storedProcedureName</param>
        /// <param>params SqlParameter[] arrParam</param>
        /// <returns>System.Data.DataSet</returns>
        public DataSet ExecuteDataSet(string storedProcedureName, params SqlParameter[] arrParam)
        {
            DataSet ds = new DataSet();
            SqlConnection conn = new SqlConnection(ConnectionString);
            SqlCommand cmd = new SqlCommand(storedProcedureName, conn);
            cmd.CommandType = CommandType.StoredProcedure;
            if (conn.State == ConnectionState.Closed || conn.State == ConnectionState.Broken)
            {
                conn.Open();
            }
            try
            {
                if (arrParam != null)
                {
                    foreach (SqlParameter param in arrParam)
                    {
                        cmd.Parameters.Add(param);
                    }
                }
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(ds);
                return ds;
            }
            catch (System.Exception ex)
            {
                throw new Exception("Error : " + ex.Message);
            }
            finally
            {
                cmd.Dispose();
                conn.Close();
            }
        }

        /// <summary>
        /// Đầu vào là tên một thủ tục và các tham số truyền vào thủ tục đó
        /// Đầu ra là một DataTable (kiểu dữ liệu có cấu trúc bảng)
        /// </summary>
        /// <qualifier></qualifier>
        /// <body></body>
        /// <param>string storedProcedureName</param>
        /// <param>params SqlParameter[] arrParam</param>
        /// <returns>System.Data.DataTable</returns>
        public DataTable ExecuteDataTable(string storedProcedureName, params SqlParameter[] arrParam)
        {
            DataTable dt = new DataTable();
            SqlConnection conn = new SqlConnection(ConnectionString);
            SqlCommand cmd = new SqlCommand(storedProcedureName, conn);
            cmd.CommandType = CommandType.StoredProcedure;
            if (conn.State == ConnectionState.Closed || conn.State == ConnectionState.Broken)
            {
                conn.Open();
            }
            try
            {
                if (arrParam != null)
                {
                    foreach (SqlParameter param in arrParam)
                    {
                        cmd.Parameters.Add(param);
                    }
                }
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(dt);
                return dt;
            }
            catch (System.Exception ex)
            {
                throw new Exception("Error : " + ex.Message);
            }
            finally
            {
                cmd.Dispose();
                conn.Close();
            }
        }

        /// <summary>
        /// Đầu vào là tên một thủ tục và các tham số truyền vào thủ tục đó
        /// Đầu ra là một DataSet (kiểu dữ liệu có cấu trúc bảng)
        /// </summary>
        /// <qualifier></qualifier>
        /// <body></body>
        /// <param>string storedProcedureName</param>
        /// <param>params SqlParameter[] arrParam</param>
        /// <returns>System.Data.DataSet</returns>
        public DataSet ExecuteDataSet(string storedProcedureName, string tableName, params SqlParameter[] arrParam)
        {
            DataSet ds = new DataSet();
            SqlConnection conn = new SqlConnection(ConnectionString);
            SqlCommand cmd = new SqlCommand(storedProcedureName, conn);
            cmd.CommandType = CommandType.StoredProcedure;
            if (conn.State == ConnectionState.Closed || conn.State == ConnectionState.Broken)
            {
                conn.Open();
            }
            try
            {
                if (arrParam != null)
                {
                    foreach (SqlParameter param in arrParam)
                    {
                        cmd.Parameters.Add(param);
                    }
                }
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(ds, tableName);
                return ds;
            }
            catch (System.Exception ex)
            {
                throw new Exception("Error : " + ex.Message);
            }
            finally
            {
                cmd.Dispose();
                conn.Close();
            }
        }

        /// <summary>
        /// Đầu vào là tên một thủ tục và các tham số truyền vào thủ tục đó
        /// Đầu là kết quả của việc thực thi thủ tục trong SQL Server
        /// Kiểu trả về là kiểu số nguyên
        /// </summary>
        /// <qualifier></qualifier>
        /// <body></body>
        /// <param>string storedProcedureName</param>
        /// <param>params SqlParameter[] arrParam</param>
        /// <returns>int</returns>
        public int ExecuteNoneQuery(string storedProcedureName, params SqlParameter[] arrParam)
        {
            SqlConnection conn = new SqlConnection(ConnectionString);
            SqlCommand cmd = new SqlCommand(storedProcedureName, conn);
            cmd.CommandType = CommandType.StoredProcedure;
            if (conn.State == ConnectionState.Closed || conn.State == ConnectionState.Broken)
            {
                conn.Open();
            }
            try
            {
                if (arrParam != null)
                {
                    foreach (SqlParameter param in arrParam)
                    {
                        cmd.Parameters.Add(param);
                    }
                }
                int rowEffected = cmd.ExecuteNonQuery();
                return rowEffected;
            }
            catch (System.Exception ex)
            {
                throw new Exception("Error : " + ex.Message);
            }
            finally
            {
                cmd.Dispose();
                conn.Close();
            }
        }

        /// <summary>
        /// Đầu vào là tên một thủ tục và các tham số truyền vào thủ tục đó
        /// Đầu ra là kết quả của việc thực thi thủ tục
        /// Kiểu trả về là kiểu đối tượng (object)
        /// </summary>
        /// <qualifier></qualifier>
        /// <body></body>
        /// <param>string storedProcedureName</param>
        /// <param>params SqlParameter[] arrParam</param>
        /// <returns>object</returns>
        public object ExecuteScalar(string storedProcedureName, params SqlParameter[] arrParam)
        {
            SqlConnection conn = new SqlConnection(ConnectionString);
            SqlCommand cmd = new SqlCommand(storedProcedureName, conn);
            cmd.CommandType = CommandType.StoredProcedure;
            if (conn.State == ConnectionState.Closed || conn.State == ConnectionState.Broken)
            {
                conn.Open();
            }
            try
            {
                if (arrParam != null)
                {
                    foreach (SqlParameter param in arrParam)
                    {
                        cmd.Parameters.Add(param);
                    }
                }
                return cmd.ExecuteScalar();
            }
            catch (System.Exception ex)
            {
                throw new Exception("Error : " + ex.Message);
            }
            finally
            {
                cmd.Dispose();
                conn.Close();
            }
        }

        /// <summary>
        /// Đầu vào là tên một thủ tục và các tham số truyền vào thủ tục đó
        /// Đầu là là mã của đối tượng được thực thi trong thủ tục
        /// Kiểu trả về là kiểu số nguyên (mã của đối tượng)
        /// </summary>
        /// <qualifier></qualifier>
        /// <body></body>
        /// <param>string storedProcedureName</param>
        /// <param>params SqlParameter[] arrParam</param>
        /// <returns>int</returns>
        public int GetInsertedIdWithExecuteNoneQuery(string storedProcedureName, params SqlParameter[] arrParam)
        {
            SqlConnection conn = new SqlConnection(ConnectionString);
            SqlCommand cmd = new SqlCommand(storedProcedureName, conn);
            cmd.CommandType = CommandType.StoredProcedure;
            int insertedId = 0;
            if (conn.State == ConnectionState.Closed || conn.State == ConnectionState.Broken)
            {
                conn.Open();
            }
            try
            {
                if (arrParam != null)
                {
                    foreach (SqlParameter param in arrParam)
                    {
                        cmd.Parameters.Add(param);
                    }
                }
                cmd.ExecuteNonQuery();
                insertedId = Convert.ToInt32(cmd.Parameters[cmd.Parameters.Count - 1].Value);
            }
            catch (System.Exception ex)
            {
                throw new Exception("Error : " + ex.Message);
            }
            finally
            {
                cmd.Dispose();
                conn.Close();
            }
            return insertedId;
        }
    }
}
